/**
  ******************************************************************************
  * @file    backwork.c
  * @author  Dragon.Chen
  * @version V1.000
  * @date    04-15-2020
  * @brief      业务逻辑函数的封装
  * @project linux client
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2018 上海今中网络科技有限公司 </center></h2>
  ******************************************************************************
  */
#ifndef __BACKWORK__H__
#define __BACKWORK__H__

#include "prototypes.h"
#include "socket-util.h"
#include "basement.h"
#include "log-util.h"
#include "clientconfig.h"

#define streql					    !strcmp
#define strneql					    !strncmp

#define RETURN_FAILURE			    -1
#define RETURN_SUCCESS				0
#define SERVER_PASSWORD             "jinzhong&*%%*&gnohznij"        // 链接服务器口令(根据需要改动)
#define SERVER_PSWDSIZE             strlen(SERVER_PASSWORD)         // 口令长度
#define LINUX_CLIENT_VERSION 	    "EDGE:V1.0.0"		            // version for client
#define LINUX_CLIENT_NAME 			"secureClient"		            // version for client
#define CLIENT_POSITIVE				"OK"
#define CLIENT_NEGTVIE				"ER"
#define YES							1
#define NO							0

#define CLIENT_DATA_PACK_HEADLEN    4

extern BOOL         ServerAlive;
extern BOOL         ServerLoop;
extern int          EventSelect;
extern int          HeartbeatTime;
extern int          HeartbeatTimeout;

void *heartbeat_timeout(void *args);

/**
  * @brief   接收heartbag结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，接收未完成返回1
  */
int receive_result_of_heartbeat(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送heartbag请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_heartbeat(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收heartbag timeout结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，接收未完成返回1
  */
int receive_result_of_heartbeat_timeout(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送heartbag请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_heartbeat_timeout(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收协商的数字，决定是否启动服务
  * @param   arg1 客户端信息结构体
  * @retval  启动返回0， 失败返回-1，
  */
int start_service_type(CLIENT_INFO_T * clientInfo);
//******************************************************************************

/**
  * @brief   启动所有的服务
  * @param   NULL
  * @retval
  */
void startup_all_services(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   获取utunnel配置信息
  * @param   arg1 客户端信息结构体
  * @retval  0 成功  -1 失败
  */
int generate_utunnel_config(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收utunnel结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_utunnel(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送utunnel请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_utunnel(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   获取stunnel配置信息
  * @param   arg1 客户端信息结构体
  * @retval  成功生成规则返回0, 失败返回-1
  */
int generate_stunnel_config(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收stunnel结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_stunnel(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送stunnel请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_stunnel(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   获取VPN配置信息
  * @param   arg1 客户端信息结构体
  * @retval  0 成功  -1 失败
  */
int generate_openvpn_config(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收openvpn结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_openvpn(CLIENT_INFO_T *clientInfo, CLIENT_CONFIG_T *clientConfig);
//******************************************************************************

/**
  * @brief   发送openvpn请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_openvpn(CLIENT_INFO_T *clientInfo);
//******************************************************************************


/**
  * @brief   接收vpntype结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_apptype(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送vpntype请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_apptype(CLIENT_INFO_T *clientInfo);
//******************************************************************************


/**
  * @brief   接收bind结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_bind(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送bind请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_bind(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收SN结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_sn(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送SN请求
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_sn(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收X509返回的结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1
  */
int receive_result_of_x509(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   发送X509上下文
  * @param   aarg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_x509(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收版本结果
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1， 接收未完成返回1， 需要更新返回2
  */
int receive_result_of_version(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   向服务器发送版本号
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0，失败返回-1，发送未完成返回1
  */
int send_request_of_version(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收服务器认证
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1
  */
int receive_result_of_welcome(CLIENT_INFO_T *clientInfo);
//******************************************************************************

/**
  * @brief   接收服务器认证
  * @param   arg1 客户端信息结构体
  * @retval  成功返回0， 失败返回-1
  */
int send_request_of_welcome(CLIENT_INFO_T *clientInfo);
//******************************************************************************

#endif //#ifndef _BACKWORK_H_
/******************* (C) COPYRIGHT 2020 上海今中网络科技有限公司 *****END OF FILE****/
